#ifndef __OS_H
#define __OS_H

#include "stdint.h"

// 系统配置
#define MAX_TASKS 32 // 最大任务数
#define STACK_SIZE 512 // 

typedef struct {
	uint32_t r4;
	uint32_t r5;
	uint32_t r6;
	uint32_t r7;
	uint32_t r8;
	uint32_t r9;
	uint32_t r10;
	uint32_t r11;
	uint32_t r1;
	uint32_t r2;
	uint32_t r3;
	uint32_t r12;
	uint32_t lr;
	uint32_t pc;
	uint32_t psr;
} TaskContext;

// 任务优先级
typedef enum {
	PRIORITY_LOW,
	PRIORITY_NORMAL,
	PRIORITY_HIGH,
	PRIORITY_REALTIME
} TaskPriority;

// 任务状态
typedef enum {
	TASK_READY,
	TASK_RUNNING,
	TASK_BLOCKED,
	TASK_SUSPENDED
} TaskState;

// 任务控制块
typedef struct {
	void *sp; // 栈指针
	TaskState state; // 任务状态
	TaskPriority priority; // 任务优先级
	unsigned int delay; // 任务延迟时间
	void *entry; // 任务入口地址
	int stackSize; // 任务栈大小
	char *name; // 任务名称
	unsigned char stack[STACK_SIZE];
} Task;

extern Task *g_CurrentTask;
extern Task *g_NextTask;

// 任务管理函数
void os_Init(void); // 系统初始化
unsigned int os_TaskCreate(void (*task)(void), char *name, TaskPriority priority, unsigned int stackSize); // 创建任务
void os_TaskDelete(unsigned int taskId); // 删除任务
void os_TaskSuspend(unsigned int taskId); // 挂起任务
void os_TaskResume(unsigned int taskId); // 恢复任务
void os_TaskDelay(unsigned int ms); // 任务延迟

// 任务调度函数
void os_ScheduleStart(void); // 启动任务调度
void os_ScheduleTick(void); // 任务调度时钟中断处理函数
void os_ContextSwitch(void); // 任务切换
static unsigned int os_FindNextTask(void);
int os_GetSysTicks(void);
int os_GetCurrentTaskId(void);



#endif